package com.example.demo.common.swagger;

//import com.google.common.base.Predicate;
//import com.google.common.base.Predicates;
//import io.swagger.annotations.Api;
//import io.swagger.annotations.ApiOperation;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
//import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
//import springfox.documentation.RequestHandler;
//import springfox.documentation.builders.ApiInfoBuilder;
//import springfox.documentation.builders.PathSelectors;
//import springfox.documentation.builders.RequestHandlerSelectors;
//import springfox.documentation.service.*;
//import springfox.documentation.spi.DocumentationType;
//import springfox.documentation.spi.service.contexts.SecurityContext;
//import springfox.documentation.spring.web.plugins.Docket;
//import springfox.documentation.swagger.web.ApiKeyVehicle;
//import springfox.documentation.swagger2.annotations.EnableSwagger2;
//
//import java.util.ArrayList;
//import java.util.Collections;
//import java.util.List;


/**
 *
 */
//@Configuration
//@EnableSwagger2
public class Swagger2Config {//extends WebMvcConfigurationSupport {
//    @Autowired
//    private SwaggerProperties swaggerProperties;
//
//    @Bean
//    public Docket createRestApi(){
//
//        // base-path处理
//        // 当没有配置任何path的时候，解析/**
//        if (swaggerProperties.getBasePath().isEmpty()) {
//            swaggerProperties.getBasePath().add("/**");
//        }
//        List<Predicate<String>> basePath = new ArrayList();
//        for (String path : swaggerProperties.getBasePath()) {
//            basePath.add(PathSelectors.ant(path));
//        }
//
//        // exclude-path处理
//        List<Predicate<String>> excludePath = new ArrayList<>();
//        for (String path : swaggerProperties.getExcludePath()) {
//            excludePath.add(PathSelectors.ant(path));
//        }
//
//        return new Docket(DocumentationType.SWAGGER_2)
//                .apiInfo(apiInfo())
//                .securitySchemes(Collections.singletonList(apiKey()))
//                .securityContexts(Collections.singletonList(securityContext()))
//                .select()
//                //为当前包下controller生成API文档
//                .apis(RequestHandlerSelectors.basePackage(swaggerProperties.getBasePackage()))
//                //为有@Api注解的Controller生成API文档
//                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
//                //为有@ApiOperation注解的方法生成API文档
//                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
//                //为任何接口生成API文档
//                .apis(RequestHandlerSelectors.any())
////                .paths(PathSelectors.any())
//                .paths(
//                    Predicates.and(
//                        Predicates.not(Predicates.or(excludePath)),
//                        Predicates.or(basePath)
//                    )
//                )
//                .build();
//        //添加登录认证
//                /*.securitySchemes(securitySchemes())
//                .securityContexts(securityContexts());*/
//    }
//
//    private ApiInfo apiInfo() {
//        Contact contact = swaggerProperties.getContact();
//        return new ApiInfoBuilder()
//                .title(swaggerProperties.getTitle())
//                .description(swaggerProperties.getDescription())
//                .contact(contact)
//                .version(swaggerProperties.getVersion())
//                .license(swaggerProperties.getLicense())
//                .licenseUrl(swaggerProperties.getLicenseUrl())
//                .build();
//    }
//
//    /**
//     * 配置swagger2的静态资源路径
//     * @param registry
//     */
//    @Override
//    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
//        // 解决静态资源无法访问
//        registry.addResourceHandler("/**")
//                .addResourceLocations("classpath:/static/");
//        // 解决swagger无法访问
//        registry.addResourceHandler("/swagger-ui.html")
//                .addResourceLocations("classpath:/META-INF/resources/");
//        // 解决swagger的js文件无法访问
//        registry.addResourceHandler("/webjars/**")
//                .addResourceLocations("classpath:/META-INF/resources/webjars/");
//    }
//
//
//    /**
//     * 给API文档接口添加安全认证
//     */
//    /**
//     * 配置基于 ApiKey 的鉴权对象
//     *
//     * @return
//     */
//    private ApiKey apiKey() {
//        return new ApiKey(swaggerProperties.getAuthorization().getName(),
//                swaggerProperties.getAuthorization().getKeyName(),
//                ApiKeyVehicle.HEADER.getValue());
//    }
//
//    /**
//     * 配置默认的全局鉴权策略的开关，以及通过正则表达式进行匹配；默认 ^.*$ 匹配所有URL
//     * 其中 securityReferences 为配置启用的鉴权策略
//     *
//     * @return
//     */
//    private SecurityContext securityContext() {
//        return SecurityContext.builder()
//                .securityReferences(defaultAuth())
//                .forPaths(PathSelectors.regex(swaggerProperties.getAuthorization().getAuthRegex()))
//                .build();
//    }
//
//    /**
//     * 配置默认的全局鉴权策略；其中返回的 SecurityReference 中，reference 即为ApiKey对象里面的name，保持一致才能开启全局鉴权
//     *
//     * @return
//     */
//    private List<SecurityReference> defaultAuth() {
//        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
//        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
//        authorizationScopes[0] = authorizationScope;
//        return Collections.singletonList(SecurityReference.builder()
//                .reference(swaggerProperties.getAuthorization().getName())
//                .scopes(authorizationScopes).build());
//    }
//
//
//    //swagger2免拦截
//    //filterChainDefinitionMap.put("/swagger-ui.html**", "anon");
//    //filterChainDefinitionMap.put("/v2/api-docs", "anon");
//    //filterChainDefinitionMap.put("/swagger-resources/**", "anon");
//    //filterChainDefinitionMap.put("/webjars/**", "anon");
}